package log

import (
	"github.com/pkg/errors"
	"github.com/sirupsen/logrus"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
)

// Logger 全局日志实例
var Logger *logrus.Logger

// 初始化日志配置
func init() {
	// 加载日志配置
	config := LoadConfig()

	// 创建日志实例
	Logger = logrus.New()

	// 设置日志级别
	if err := SetLevel(config.Level); err != nil {
		Logger.Warnf("设置日志级别失败，使用默认级别: %v", err)
		Logger.SetLevel(logrus.InfoLevel)
	}

	// 设置输出
	if config.OutputPath == "stdout" {
		Logger.SetOutput(os.Stdout)
	} else {
		Logger.SetOutput(&lumberjack.Logger{
			Filename:   config.OutputPath,
			MaxSize:    config.MaxSize,
			MaxBackups: config.MaxBackups,
			MaxAge:     config.MaxAge,
			Compress:   config.Compress,
		})
	}

	// 设置日志格式
	if config.Format == "text" {
		Logger.SetFormatter(&logrus.TextFormatter{
			TimestampFormat: "2006-01-02 15:04:05",
			FullTimestamp:   true,
		})
	} else {
		Logger.SetFormatter(&logrus.JSONFormatter{
			TimestampFormat: "2006-01-02 15:04:05",
		})
	}

	// 设置报告调用者信息
	Logger.SetReportCaller(true)
}

// SetLevel 设置日志级别
// level: debug, info, warn, error, fatal, panic
func SetLevel(level string) error {
	logLevel, err := logrus.ParseLevel(level)
	if err != nil {
		return errors.Wrapf(err, "解析日志级别失败: %s", level)
	}
	Logger.SetLevel(logLevel)
	return nil
}

// WithError 将自定义错误信息添加到日志字段中
// err: 错误实例，可以是自定义Error类型或标准错误
func WithError(err error) *logrus.Entry {
	// 标准错误类型
	return Logger.WithError(err)
}

// InitWithConfig 使用自定义配置初始化日志
func InitWithConfig(config *Config) error {
	// 设置日志级别
	if err := SetLevel(config.Level); err != nil {
		return errors.Wrap(err, "设置日志级别失败")
	}

	// 设置输出
	if config.OutputPath == "stdout" {
		Logger.SetOutput(os.Stdout)
	} else {
		Logger.SetOutput(&lumberjack.Logger{
			Filename:   config.OutputPath,
			MaxSize:    config.MaxSize,
			MaxBackups: config.MaxBackups,
			MaxAge:     config.MaxAge,
			Compress:   config.Compress,
		})
	}

	// 设置日志格式
	if config.Format == "text" {
		Logger.SetFormatter(&logrus.TextFormatter{
			TimestampFormat: "2006-01-02 15:04:05",
			FullTimestamp:   true,
		})
	} else {
		Logger.SetFormatter(&logrus.JSONFormatter{
			TimestampFormat: "2006-01-02 15:04:05",
		})
	}

	return nil
}

// Debug 记录调试级别日志
func Debug(message string, fields ...logrus.Fields) {
	if len(fields) > 0 {
		Logger.WithFields(fields[0]).Debug(message)
	} else {
		Logger.Debug(message)
	}
}

// Info 记录信息级别日志
func Info(message string, fields ...logrus.Fields) {
	if len(fields) > 0 {
		Logger.WithFields(fields[0]).Info(message)
	} else {
		Logger.Info(message)
	}
}

// Warn 记录警告级别日志
func Warn(message string, err error, fields ...logrus.Fields) {
	entry := Logger.WithError(err)
	if len(fields) > 0 {
		entry = entry.WithFields(fields[0])
	}
	entry.Warn(message)
}

// Error 记录错误级别日志
func Error(message string, err error, fields ...logrus.Fields) {
	entry := Logger.WithError(err)
	if len(fields) > 0 {
		entry = entry.WithFields(fields[0])
	}
	entry.Error(message)
}

// Fatal 记录致命级别日志并退出程序
func Fatal(message string, err error, fields ...logrus.Fields) {
	entry := Logger.WithError(err)
	if len(fields) > 0 {
		entry = entry.WithFields(fields[0])
	}
	entry.Fatal(message)
}
